package LinkedList;

import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;

     /*
        1. LinkedList实现了List接口
        2. LinkedList的底层使用了双向链表
        3. LinkedList没有实现RandomAccess接口，因此LinkedList不支持随机访问
        4. LinkedList的任意位置插入和删除元素时效率比较高，时间复杂度为O(1)
        5. LinkedList比较适合任意位置插入的场景
     */
public class Test {
    public static void main(String[] args) {
        List<Integer> list=new LinkedList<>();
        //add 尾插法
        list.add(3);
        list.add(2);
        list.add(1);
        System.out.println(list);//[3,2,1]
        list.remove(2);
        //foreach()遍历
        for (int x:list) {
            System.out.println(x);
        }
        //迭代器遍历
        ListIterator<Integer> iterator=list.listIterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next()+" ");
        }
        System.out.println();
        //方向迭代器--反向遍历
        ListIterator<Integer> riterator=list.listIterator(list.size());
        while(riterator.hasPrevious()){
            System.out.println(riterator.previous());
        }
        System.out.println();


    /*
        尾插e   boolean add(E e)
        将e插入到index位置   void add(int index, E e)
        尾插c中的元素   boolean addAll(Collection<? extends E> c)
        删除index位置元素   E remove(int index)
        删除遇到的第一个 o   boolean remove(Object o)
        取下标index位置元素  E get(int index) 获
        将下标index位置元素设置为element   E set(int index, E element)
        清空  void clear()
        判断o是否在线性表中   boolean contains(Object o)
        返回第一个o所在下标   int indexOf(Object o)
        返回最后一个o的下标   int lastIndexOf(Object o)
        截取部分list   List<E> subList(int fromIndex, int toIndex)
    */


    /*
        不同点            ArrayList              LinkedList
        存储空间上        物理上一定连续       逻辑上连续，但物理上不一定连续
        随机访问           支持O(1)            不支持：O(N)
        头插       需要搬移元素，效率低O(N)    只需修改引用的指向，时间复杂度为O(1)
        插入          空间不够时需要扩容         没有容量的概念
        应用场景       元素高效存储+频繁访问    任意位置插入和删除频繁
     */
    }
}
